(() => {
  /**
   * 在不知道类型的情况下可以使用泛型
   *  泛型会自动判断数据类型
   * @param name 
   * @returns 
   */
  function f1<S>(name: S): S {
    return name
  }
  f1<string>('asas')

  // 可以指定多个泛型
  function f2<S, N>(name: S, age: N): N {
    return age
  }


  class Test<S>{
    constructor(public name: S) {

    }
  }
  const T = new Test<string>('zzh')


  interface Inter {
    length: number
  }

  class Arr implements Inter {
    constructor(public length: number) {

    }
  }
  const arr = new Arr(100)

  /**
   * <I extends inter>表示I必须是Inter实现类(子类)
   * @param name 
   * @returns 
   */
  function f3<I extends Inter>(name: I): number {
    console.log(name.length);
    return name.length
  }

  f3<Inter>(arr)

})()